/* -*-jde-*- */
package app.empresa;

import app.conexion.Conexion;
import app.conexion.ConexionException;
import app.htmlGenerator.HTMLVacanteGenerator;
import app.util.Fecha;
import app.util.SQLInjectionException;
import app.util.Validator;
import app.util.appException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Bean Empresa Genera una Empresa dependiendo del identificador de usuario
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Diciembre 2011
 * @version 0.1
 */
public class Empresa {

    /**
     * Identificador del usuario
     */
    private int nIdUsuario;
    /**
     * Nombre de la empresa
     */
    private String sNombre;
    /**
     * Descripción de la empresa
     */
    private String sDescripcion;
    /**
     * RFC asignado a la empresa
     */
    private String sRFC;
    /**
     * página web de la empresa
     */
    private String sWeb;
    /**
     * Nombre del responsable o contacto de la empresa
     */
    private String sNombreContactoEmpresa;
    /**
     * Correo electrónico general de la empresa
     */
    private String sCorreo;
    /**
     * Telefono asignado
     */
    private String sTelefono;
    /**
     * Donde guardaremos la página disponible únicamente de la vista de la
     * empresa
     */
    private String html;

    /**
     * Construimos una empresa con el identificador de usuario.
     *
     * @param nIdUsuario El identificador del usuario
     * @param sNombre El nombre de la empresa
     * @param sDescripcion La descripcion de la empresa
     * @param sRFC El RFC de la empresa
     * @param sWeb La pagina web
     * @param sNombreContactoEmpresa El nombre para el contacto de la empresa
     * @param sCorreo El correo
     * @param sTelefono El telefono
     */
    public Empresa(int nIdUsuario, String sNombre, String sDescripcion, String sRFC,
            String sWeb, String sNombreContactoEmpresa, String sCorreo, String sTelefono) {
        this.nIdUsuario = nIdUsuario;
        this.sNombre = sNombre;
        this.sDescripcion = sDescripcion;
        this.sRFC = sRFC;
        this.sWeb = sWeb;
        this.sNombreContactoEmpresa = sNombreContactoEmpresa;
        this.sCorreo = sCorreo;
        this.sTelefono = sTelefono;
    }

    /**
     * Contruye una empresa con los datos de la base de datos dado el id
     *
     * @param nIdUsuario
     */
    public Empresa(int nIdUsuario) throws appException {

        try {

            Conexion con = new Conexion();
            String query = "select * from empresas where nidusuario = " + nIdUsuario + ";";

            if (!Validator.checkSQLInjection(query)) {
                ResultSet r = con.exec(query);

                while (r.next()) {

                    String s1 = r.getString("snombre");
                    String s2 = r.getString("sdescripcion");
                    String s3 = r.getString("srfc");
                    String s4 = r.getString("sweb");
                    String s5 = r.getString("snombrecontactoempresa");
                    String s6 = r.getString("scorreo");
                    String s7 = r.getString("stelefono");

                    this.nIdUsuario = nIdUsuario;
                    this.sNombre = s1;
                    this.sDescripcion = s2;
                    this.sRFC = s3;
                    this.sWeb = s4;
                    this.sNombreContactoEmpresa = s5;
                    this.sCorreo = s6;
                    this.sTelefono = s7;
                }
            }

            con.close();

        } catch (SQLException ex) {
            System.err.println(ex);
            Logger.getLogger(Empresa.class.getName()).log(Level.SEVERE, null, ex);
            throw new appException("No se pudo recuperar el elemento: Empresa");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo recuperar el elemento: Empresa");
        } catch (SQLInjectionException sqlie) {
            System.err.println(sqlie);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqlie);
            throw new appException(sqlie.getMessage());
        }
    }

    /**
     * @return the nIdUsuario
     */
    public int getnIdUsuario() {
        return nIdUsuario;
    }

    /**
     * @return the sNombre
     */
    public String getsNombre() {
        return sNombre;
    }

    /**
     * @return the sDescripcion
     */
    public String getsDescripcion() {
        return sDescripcion;
    }

    /**
     * @return the sRFC
     */
    public String getsRFC() {
        return sRFC;
    }

    /**
     * @return the sWeb
     */
    public String getsWeb() {
        return sWeb;
    }

    /**
     * @return the sNombreContactoEmpresa
     */
    public String getsNombreContactoEmpresa() {
        return sNombreContactoEmpresa;
    }

    /**
     * @return the sCorreo
     */
    public String getsCorreo() {
        return sCorreo;
    }

    /**
     * @return the sTelefono
     */
    public String getsTelefono() {
        return sTelefono;
    }

    @Override
    public String toString() {
        return "Empresa{" + "nIdUsuario=" + nIdUsuario + ", sNombre=" + sNombre
                + ", sDescripcion=" + sDescripcion + ", sRFC=" + sRFC + ", sWeb="
                + sWeb + ", sNombreContactoEmpresa=" + sNombreContactoEmpresa
                + ", sCorreo=" + sCorreo + ", sTelefono=" + sTelefono + '}';
    }

    /**
     * Guarda el objeto en la base de datos independientemente si éste es nuevo
     * o no.
     */
    public void save() throws appException {

        try {

            Conexion con = new Conexion();

            boolean isnuevo = false;
            String nuevo = "select isEmpresa(" + nIdUsuario + ");";
            ResultSet rs = con.exec(nuevo);

            while (rs.next()) {
                isnuevo = rs.getBoolean("isempresa");
            }

            System.out.println("is nuevo? : " + isnuevo);

            String query = "select ";
            if (!isnuevo) {
                query += "addEmpresa(" + nIdUsuario + "";
                query += ", '" + sNombre + "'";
                query += ", '" + sDescripcion + "'";
                query += ", '" + sRFC + "'";
                query += ", '" + sWeb + "'";
                query += ", '" + sNombreContactoEmpresa + "'";
                query += ", '" + sCorreo + "'";
                query += ", '" + sTelefono + "'";
                query += ");";

                if (!Validator.checkSQLInjection(query)) {
                    con.exec(query);
                }

            } else {

                query += "updateEmpresa(" + nIdUsuario + "";
                query += ", '" + sNombre + "'";
                query += ", '" + sDescripcion + "'";
                query += ", '" + sRFC + "'";
                query += ", '" + sNombreContactoEmpresa + "'";
                query += ", '" + sNombre + "'";
                query += ", '" + sCorreo + "'";
                query += ", '" + sTelefono + "'";
                query += ");";

                if (!Validator.checkSQLInjection(query)) {
                    con.exec(query);
                }
            }

            con.close();

        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo guardar el elemento: Empresa");
        } catch (SQLException sqle) {
            System.err.println(sqle);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqle);
            throw new appException("No se pudo guardar el elemento: Empresa");
        } catch (SQLInjectionException sqlie) {
            System.err.println(sqlie);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqlie);
            throw new appException(sqlie.getMessage());
        }

    }

    /**
     * Borra el objeto de la base de datos.
     */
    public void delete() throws appException {
        try {

            Conexion con = new Conexion();
            String query = "select deleteEmpresa( " + nIdUsuario + " );";
            con.exec(query);

            con.close();
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo borrar el elemento: Empresa");
        }
    }

    /**
     * Regresa la lista de identificadores de los alumnos postulados a esta
     * vacante
     *
     * @return La lista de identificadores de usuarios
     */
    public LinkedList<Vacante> getVacantes() throws appException {

        try {

            Conexion con = new Conexion();
            String query = "select nidvacante from empresavacantes where nidusuario = " + nIdUsuario + ";";
            LinkedList<Vacante> ids = new LinkedList<Vacante>();

            if (!Validator.checkSQLInjection(query)) {
                ResultSet r = con.exec(query);
                while (r.next()) {
                    int idVacante = r.getInt("nidvacante");

                    Vacante v = new Vacante(idVacante);
                    HTMLVacanteGenerator htmlvg = new HTMLVacanteGenerator(v);

                    String s = htmlvg.generarVacante();
                    v.setHtmlVacante(s);
                    ids.add(v);
                }
            }

            con.close();

            return ids;

        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar los elementos: Vacantes");
        } catch (SQLException sqle) {
            System.err.println(sqle);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqle);
            throw new appException("No se pudieron recuperar los elementos: Vacantes");
        } catch (SQLInjectionException sqlie) {
            System.err.println(sqlie);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqlie);
            throw new appException(sqlie.getMessage());
        }
    }

    /**
     * Conexiones de prueba a la base de datos
     *
     * @param args
     * @throws ConexionException
     * @throws SQLException
     * @throws appException
     */
    public static void main(String args[]) throws ConexionException, SQLException, appException {


        //nuevo
        Empresa e = new Empresa(1);
        //e.save();
        // existente
        //Empresa e = new Empresa(1, "nombre Empresa", "descripcion" , "RFC", "SWEB", "SnombreEmprresa ",
        //      "SCorreo", "telefono");
        //e.save();

        //e.delete();

        LinkedList<Vacante> vacantes = e.getVacantes();

        System.out.println(vacantes);

        //e = new Empresa(1);


        System.out.println(e);
    }

    /**
     * @param sNombre the sNombre to set
     */
    public void setsNombre(String sNombre) {
        this.sNombre = sNombre;
    }

    /**
     * @param sDescripcion the sDescripcion to set
     */
    public void setsDescripcion(String sDescripcion) {
        this.sDescripcion = sDescripcion;
    }

    /**
     * @param sRFC the sRFC to set
     */
    public void setsRFC(String sRFC) {
        this.sRFC = sRFC;
    }

    /**
     * @param sWeb the sWeb to set
     */
    public void setsWeb(String sWeb) {
        this.sWeb = sWeb;
    }

    /**
     * @param sNombreContactoEmpresa the sNombreContactoEmpresa to set
     */
    public void setsNombreContactoEmpresa(String sNombreContactoEmpresa) {
        this.sNombreContactoEmpresa = sNombreContactoEmpresa;
    }

    /**
     * @param sCorreo the sCorreo to set
     */
    public void setsCorreo(String sCorreo) {
        this.sCorreo = sCorreo;
    }

    /**
     * @param sTelefono the sTelefono to set
     */
    public void setsTelefono(String sTelefono) {
        this.sTelefono = sTelefono;
    }

    /**
     * @return the html
     */
    public String getHtml() {
        return html;
    }

    /**
     * @param html the html to set
     */
    public void setHtml(String html) {
        this.html = html;
    }
}
